package com.livegoods.service;

import com.livegoods.commons.pojo.LivegoodsResult;
import com.livegoods.pojo.LoginLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.time.Duration;
import java.util.Date;
import java.util.Random;

@Service
public class UserServiceImpl implements UserService {


    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     *
     * 发送验证码思路
     *
     * 0.以用户的手机做为key 先从Redis查询是否有随机码，如果有，说明用户已经发送过，提示用户，请不要频繁发送掩码
     *
     * 1，随机生成4位纯数字作为验证码
     *
     * 2，以用户的手机作为key 将验证码存储到redis中，并且设置过期时间 ，如 2分钟
     *
     * 3，调用阿里云/腾讯云 短信api将将 验证码发送给用户手机
     *
     *
     * @param phone
     * @return
     */
    @Override
    public LivegoodsResult sendVerifyCode(String phone) {

        //获取Redis 字符串操作
        ValueOperations vps = redisTemplate.opsForValue();
        //0.以用户的手机做为key 先从Redis查询是否有随机码，如果有，说明用户已经发送过，提示用户，请不要频繁发送掩码
        Integer verifyCode = (Integer)vps.get(phone);

        if(verifyCode!=null){
            return LivegoodsResult.error("验证码2分钟有效，请不要频繁发送验证码!!");
        }
        //1，随机生成4位纯数字作为验证码
        Random random = new Random();
        Integer verifyCodeA = (Integer) random.nextInt(8999) + 1000;
        System.out.println("verifyCodeA = " + verifyCodeA);
        //2，以用户的手机作为key 将验证码存储到redis中，并且设置过期时间 ，如 2分钟
        vps.set(phone,verifyCodeA, Duration.ofMinutes(2));

        //3，调用阿里云/腾讯云 短信api将将 验证码发送给用户手机
        //TODO 待办任务
        return LivegoodsResult.ok();
    }

    /**
     *
     * 手机验证码 登录/注册 一体操作思路
     * 1，查询用户表user是否有此用户(手机)
     *   有：不做任何处理
     *   没有：将手机号存储数据库相当于注册了
     * 2，记录用户登陆日志（后期通过大量用户登陆日志信息分析出用户行为，做出对应商业策略）
     *
     * 3,将用户输入 密码/验证码 和 redis 中存储验证码比较
     *   相等：返回成功状态
     *   不相等：返回失败状态和提示信息
     *
     *
     * @param username
     * @param password
     * @return
     */
    @Override
    public LivegoodsResult login(String username, String password, HttpServletRequest request) {


        //创建登录日志对象
        LoginLog loginLog = new LoginLog();
        loginLog.setUsername(username);
        loginLog.setPassword(password);
        loginLog.setTime(new Date());
        loginLog.setLoginIp(request.getRemoteAddr());
        loginLog.setType(1);

        //获取Redis中的验证码
        //获取Redis 字符串操作
        ValueOperations vps = redisTemplate.opsForValue();
        //获取手机对应的验证码
        Integer verifyCode = (Integer)vps.get(username);


        LivegoodsResult livegoodsResult = new LivegoodsResult();

        if (verifyCode == null){
            loginLog.setResult(0);
            loginLog.setMsg("验证码过期，登陆失败");

            //将数据存储到MongoDB中
            mongoTemplate.insert(loginLog);

            return LivegoodsResult.error("验证码过期，请重新发送验证码");
        }
        //比较用户输入的验证码和redis中验证码
        if (!verifyCode.toString().equals(password)){
            loginLog.setResult(0);
            loginLog.setMsg("验证码错误，登陆失败");
            //将数据存储到MongoDB中
            mongoTemplate.insert(loginLog);

            return LivegoodsResult.error("验证码错误，请输入正确的验证码");
        }

        loginLog.setResult(1);
        loginLog.setMsg("登陆成功");


        //将数据存储到MongoDB中
        mongoTemplate.insert(loginLog);


        return LivegoodsResult.ok();
    }




    public static void main(String[] args) {

        Random random = new Random();
        Integer verifyCodeA = (Integer) random.nextInt(8999) + 1000;
        System.out.println("verifyCodeA = " + verifyCodeA);


    }
}
